/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef TRIANGLEWAVEFORM_H
#define TRIANGLEWAVEFORM_H

#include "WaveformBase.h"

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

/**
    Klasa reprezentująca generator sygnału trójkątnego.

    Klasa jest rodzaju WaveformBase i może być wykorzystywana jako źródło
    wartości zadanych w regulatorze. Generuje falę trójkątną o zadanym okresie,
    amplitudzie, przesuniąciu w pionie i przesunięciu fazowym. Nie są wspierane
    przebiegi piłokształtne.

    Model matematyczny sygnału trójkątnego:
    \f{eqnarray*}{
        r = \frac{i}{T} + \varphi - \mbox{floor}\left(\frac{i}{T} + \varphi\right) \\
        y(i) = 4Ar + A_{off}, \mbox{dla } r \in <0,0.25) \\
        y(i) = 2A(1-2r) + A_{off}, \mbox{dla } r \in <0.25,0.75) \\
        y(i) = 4A(r-1) + A_{off}, \mbox{dla } r \in <0.75,1) \\
    \f}
*/
class TriangleWaveform : public WaveformBase
{
public:
    /**
        Tworzy obiekt generatora fal trójkątnych.
        Łączy nowo utworzony obiekt z obiektem symulatora i ustawia
        wstępne parametry.

        \param [in] sim Objekt symulatora zarządzającego tą instancją.
        \param [in] amplitude Amplituda sygnału trójkątnego.
        \param [in] period Okres sygnału.
        \param [in] offset Przesunięcie pionowe sygnału.
        \param [in] phase Przesunięcie fazowe sygnału.
    */
    explicit TriangleWaveform(SimInterface::ISimulator& sim,
                            double amplitude = 1, double period = 25,
                            double offset = 0, double phase = 0);

    /**
        Zwraca aktualną wartość sygnału trójkątnego.
    */
    double getNextValue();
};

}   // SimEngine namespace
}   // RafMat namespace



#endif // TRIANGLEWAVEFORM_H
